前段时间在写一个格式化 SQL 的拦截器(SqlFormatterInterceptor),其中格式化的部分借用了 Druid 现成的工具类 SQLUtils,但在使用过程中发现输出的 SQL 中会出现多余的空格,复现场景如下。
原始 SQL
1 | String sql = "SELECT id,task_id,task_source, housedel_code, del_type, office_address, company_code, brand, " + |
默认格式化
1 | // 格式化代码 |
仅大写格式化
1 | // 格式化代码 |
由上述结果可以看到,在仅使用 OutputUCase
配置时,输出的 SQL 中 del_type
、class2_code
等字符后有多余的空格,经过仔细的翻看源码,问题最终定位在 SQLASTOutputVisitor.java 的第 440 行。
这段代码发生在格式化的最后步骤,拼接输出 SQL 的时候,具体逻辑是分析查询的数据库列,每当 column 数量为 5 的倍数时就调用 println()
方法。
1 | // SQLASTOutputVisitor.java#L386 |
而 println()
的实现中,如果不开启 OutputPrettyFormat
特性,就会在当前 SQL 后增加一个空格。
1 | // SQLASTOutputVisitor.java#L440 |
目前尚不明确这行代码的意图,但就结果来看,最终得到的 SQL 并不符合强迫症的审美 : (,该问题我已提到官方 ISSUE#2347,期待官方给出答案。